热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析Vue3中的响应式API:shallowReactive、shallowRef、triggerRef和customRef的使用与原理

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Vue3中 响应式 API( shallowReactiveshallowReftriggerRef customRef )详解相关的知识,希望对你有

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Vue3中 响应式 API( shallowReactiveshallowReftriggerRef customRef )详解相关的知识,希望对你有一定的参考价值。


传送门:Vue3中 响应式API ( reactive、ref、toRef、toRefs ) 详解


1. shallowReactive 函数

reactive() 的浅层作用形式。
只处理对象最外层属性的响应式(浅响应式)。
应用场景: 如果一个对象属性数据,结构较深,但变化时只是外层属性变化。

<template>
<div>
<div>
obj1.name obj1.info.age
<button &#64;click&#61;"obj1Age">obj1Age</button>
</div>
<div>
obj2.name obj2.info.age obj2.money
<button &#64;click&#61;"obj2Age">obj2Age</button>
</div>
</div>
</template>
<script>
import reactive,shallowReactive from &#39;vue&#39;;
export default
setup()
const obj1 &#61; reactive(
name:&#39;张三&#39;,
info:
age:18

)
const obj2 &#61; shallowReactive(
name:&#39;李四&#39;,
money:100,
info:
age:18

)
const obj1Age &#61; () &#61;>
obj1.info.age&#43;&#43;;

const obj2Age &#61; () &#61;>
//obj2.money&#43;&#43;; // 放开注释视图才会进行更新&#xff08;原因是 shallowRefState 首层 value 发生了改变&#xff09;
obj2.info.age&#43;&#43;;
console.log(obj1,obj2)

return
obj1,
obj2,
obj1Age,
obj2Age,



</script>

先触发 obj1Age 两次&#xff0c;再触发 obj2Age 两次。


2. shallowRef 函数

ref() 的浅层作用形式。


  • shallowRef() 函数是浅层响应&#xff0c;只有对 value 整体修改&#xff0c;才能更新到视图层&#xff1b;
  • 对属性值的修改是可以的&#xff0c;只是不更新到视图层&#xff1b;
  • 对属性值修改之后&#xff0c;可通过 triggerRef() 函数手动更新到视图&#xff1b;

应用场景&#xff1a; 如果一个对象属性数据&#xff0c;后续功能不会修改该对象中的属性&#xff0c;而是新生对象来替换。

<template>
<div>
<div>
count
<button &#64;click&#61;"changeCount">changeCount</button>
</div>
<div>
count2.num
<button &#64;click&#61;"changeCount2">changeCount2</button>
</div>
<div>
count3.num
<button &#64;click&#61;"changeCount3">changeCount3</button>
</div>
<div>
count4.num
<button &#64;click&#61;"changeCount4">changeCount4</button>
</div>
</div>
</template>
<script>
import shallowRef,triggerRef from &#39;vue&#39;;
export default
setup()
const count &#61; shallowRef(0);
const count2 &#61; shallowRef( num:0 );
const count3 &#61; shallowRef( num:0 );
const count4 &#61; shallowRef( num:0 );
const changeCount &#61; () &#61;>
count.value&#43;&#43;

// 只更改num属性值&#xff0c;不会更新视图
const changeCount2 &#61; () &#61;>
count2.value.num&#43;&#43;;
console.log(&#39;count2&#39;,count2)

// 整体更新value&#xff0c;会更新视图
const changeCount3 &#61; () &#61;>
count3.value &#61; num: 10

// 手动更新视图
const changeCount4 &#61; () &#61;>
count4.value.num&#43;&#43;;
triggerRef(count4)

return
count,
count2,
count3,
count4,
changeCount,
changeCount2,
changeCount3,
changeCount4,



</script>

只触发 changeCount2 两次&#xff08;未触发其他方法&#xff0c;防止视图更新&#xff09;


3. triggerRef 函数

强制触发依赖于一个浅层 ref 的副作用&#xff0c;这通常在对浅引用的内部值进行深度变更后使用。


  • 手动执行与 shallowRef 关联的任何作用 (effect)&#xff1b;
  • 配合 shallowRef 用的&#xff0c;并且 shallowRef 传入的是个引用类型&#xff1b;

<template>
<div>
<div>
count4.num
<button &#64;click&#61;"changeCount4">changeCount4</button>
</div>
</div>
</template>
<script>
import shallowRef,triggerRef from &#39;vue&#39;;
export default
setup()
const count4 &#61; shallowRef( num:0 );
// 手动更新视图
const changeCount4 &#61; () &#61;>
count4.value.num&#43;&#43;;
console.log(count4);
triggerRef(count4);

return
count4,
changeCount4,



</script>

只触发 changeCount4 两次


注意&#xff1a;没有 triggerReactive


4. customRef 函数

创建一个自定义的 ref&#xff0c;显式声明对其依赖追踪和更新触发的控制方式。

function customRef<T>(factory: CustomRefFactory<T>): Ref<T>
type CustomRefFactory<T> &#61; (
track: () &#61;> void,
trigger: () &#61;> void
) &#61;>
get: () &#61;> T
set: (value: T) &#61;> void

customRef() 预期接收一个工厂函数作为参数&#xff0c;这个工厂函数接受 track 和 trigger 两个函数作为参数&#xff0c;并返回一个带有 get 和 set
方法的对象。
一般来说&#xff0c;track() 应该在 get() 方法中调用&#xff0c;而 trigger() 应该在 set() 中调用。然而事实上&#xff0c;你对何时调用、是否应该调用他们有完全的控制权。

<template>
<input type&#61;"text" v-model&#61;"keyWord">
<h3> keyWord </h3>
</template>
<script>
import ref,customRef from &#39;vue&#39;;
export default
setup()
function myRef(value,delay &#61; 200)
let timer &#61; null;
// return 指代 把自定义的ref函数交出去
return customRef((track,trigger) &#61;>
// return 指代 customeRef 形参中的返回体必须返回一个对象&#xff0c;所以必须写return
return
get()
console.log(&#39;从myRef中读取值&#39;,value); // 因为模板

和输入框各读取了一次keyWord属性,所以打印2次
track();// 通知 Vue 追踪 value 的变化
return value
,
set(newVal)
// myRef(value)中的形参value代表调用自定义函数传入的参数&#xff0c;而set(newValue)中的newValue代表input输入框修改后的值。
console.log(&#39;设置值&#39;,newVal)
clearTimeout(timer);
timer &#61; setTimeout(() &#61;>
value &#61; newVal;
trigger(); // 通知 Vue 重新解析模板
,delay)


)

let keyWord &#61; myRef(&#39;hello&#39;,300);
return
keyWord



</script>

效果&#xff1a;


推荐阅读
  • 优化升级版数据采集与赋值方法,专为前文内容设计
    在前一篇文章中,方法的局限性主要体现在需要传递参数,并且参数数量受限。当页面布局与所需参数不匹配时,该方法将无法正常工作。为此,我们推出了优化升级版1.1,旨在解决这些问题并提高灵活性和适用性。 ... [详细]
  • 深入解析JavaScript中的函数防抖与节流技术及其应用场景
    本文深入探讨了JavaScript中函数防抖和节流技术的原理及应用场景。通过详细的示例代码,全面解析了这两种优化方法在实际开发中的重要作用,为开发者提供了宝贵的参考和实践指导。 ... [详细]
  • 本文详细介绍了 jQuery 的入门知识与实战应用,首先讲解了如何引入 jQuery 库及入口函数的使用方法,为初学者提供了清晰的操作指南。此外,还深入探讨了 jQuery 在实际项目中的多种应用场景,包括 DOM 操作、事件处理和 AJAX 请求等,帮助读者全面掌握 jQuery 的核心功能与技巧。 ... [详细]
  • Eclipse JFace Text框架中IDocument接口的getNumberOfLines方法详解与编程实例 ... [详细]
  • 大家好,我是梅巴哥er。本文将深入探讨Redux框架中的第三个实战案例,具体实现每两秒自动点击按钮以触发颜色变化的功能。该案例中,一个关键点在于是否需要使用异步操作来处理定时任务,我们将详细分析其必要性和实现方式。通过这一实例,读者可以更好地理解Redux在实际项目中的应用及其异步处理机制。 ... [详细]
  • 在探讨C语言编程文本编辑器的最佳选择与专业推荐时,本文将引导读者构建一个基础的文本编辑器程序。该程序不仅能够打开并显示文本文件的内容及其路径,还集成了菜单和工具栏功能,为用户提供更加便捷的操作体验。通过本案例的学习,读者可以深入了解文本编辑器的核心实现机制。 ... [详细]
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • 在ASP.NET中,实现页面间数据传递有多种技术方案。其中一种常见方法是通过URL链接地址传递参数,例如在 `send.aspx` 页面中,可以通过点击按钮将数据附加到URL中,然后在目标页面 `receive.aspx` 中解析这些参数。此外,还可以利用Session、ViewState、Cookie等机制来实现跨页面的数据共享,每种方法都有其适用场景和优缺点。 ... [详细]
  • 本文介绍了如何利用Apache POI库高效读取Excel文件中的数据。通过实际测试,除了分数被转换为小数存储外,其他数据均能正确读取。若在使用过程中发现任何问题,请及时留言反馈,以便我们进行更新和改进。 ... [详细]
  • WebKit Tap Highlight Color 的默认样式设置 ... [详细]
  • 开发笔记:深入解析Android自定义控件——Button的72种变形技巧
    开发笔记:深入解析Android自定义控件——Button的72种变形技巧 ... [详细]
  • 本次发布的Qt音乐播放器2.0版本在用户界面方面进行了细致优化,提升了整体的视觉效果和用户体验。尽管核心功能与1.0版本保持一致,但界面的改进使得操作更加直观便捷,为用户带来了更为流畅的使用体验。此外,我们还对部分细节进行了微调,以确保软件的稳定性和性能得到进一步提升。 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 在 PySimpleGUI 中实现异步功能的详细指南 ... [详细]
  • 深入解析 Vue 中通过 $route.params 实现参数传递的方法与技巧
    本文深入探讨了在 Vue 框架中利用 `$route.params` 进行参数传递的方法和技巧。通过详细解析 `$route.params` 的工作机制及其与 `$route.query` 的区别,帮助开发者更好地理解和应用这一功能。文章不仅涵盖了基本的使用方法,还提供了实际案例和最佳实践,以便读者能够灵活运用这些技术,提升开发效率和代码质量。 ... [详细]
author-avatar
WLII庾斌_787
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有